import matplotlib.pyplot as plt
import numpy as np


def demo1():
    # 创建一个新的图形对象
    fig = plt.figure()

    # 在图形对象中添加一个子图（1行1列的第一个子图）
    ax = fig.add_subplot(111)

    # 对于上面的fig.add_subplot(111)就是添加Axes的，
    # 参数的解释的在画板的第1行第1列的第一个位置生成一个Axes对象来准备作画。
    # 也可以通过fig.add_subplot(2, 2, 1)的方式生成Axes，
    # 前面两个参数确定了面板的划分，例如 2， 2会将整个面板划分成 2 * 2 的方格，
    # 第三个参数取值范围是 [1, 2*2] 表示第几个Axes。如下面的例子：
    # fig = plt.figure()
    # ax1 = fig.add_subplot(221)
    # ax2 = fig.add_subplot(222)
    # ax3 = fig.add_subplot(224)
    # 设置子图的属性，包括 x 轴和 y 轴的范围、标题、以及 x 轴和 y 轴的标签
    ax.set(xlim=[0.5, 4.5], ylim=[0, 8], title='An Example Axes',
           ylabel='Y-Axis', xlabel='X-Axis')

    # 显示图形
    plt.show()


def demo2():
    fig, axes = plt.subplots(nrows=2, ncols=2)
    axes[0, 0].set(title='Upper Left')
    axes[0, 1].set(title='Upper Right')
    axes[1, 0].set(title='Lower Left')
    axes[1, 1].set(title='Lower Right')
    plt.show()


def demo3():
    # [1, 2, 3, 4], [10, 20, 25, 30]数轴描点
    plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
    plt.xlim(0.5, 4.5)
    plt.show()


def demo4():
    # 创建 x 的值，从 0 到 π 之间的线性空间
    x = np.linspace(0, np.pi)
    print(x)
    # 计算 x 的正弦和余弦值
    y_sin = np.sin(x)
    y_cos = np.cos(x)

    # 创建一个包含 1 行 3 列子图的图形
    # figsize为绘制图片宽高
    fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

    # 在第一个子图中绘制 x 和 y_sin 的折线图
    ax1.plot(x, y_sin)
    ax1.set_title("Sine Wave")

    # 在第二个子图中绘制带有绿色圆圈和虚线的 x 和 y_sin 的图表
    ax2.plot(x, y_sin, 'go--', linewidth=2, markersize=12)
    ax2.set_title("Sine Wave with Markers")

    # 在第三个子图中绘制带有红色加号和虚线的 x 和 y_cos 的图表
    ax3.plot(x, y_cos, color='red', marker='+', linestyle='dashed')
    ax3.set_title("Cosine Wave")

    # 显示图形
    plt.show()


def demo5():
    x = np.linspace(0, 10, 200)
    data_obj = {'x': x,
                'y1': 2 * x + 1,
                'y2': 3 * x + 1.2,
                'mean': 0.5 * x * np.cos(2 * x) + 2.5 * x + 1.1}

    fig, ax = plt.subplots()

    # 填充两条线之间的颜色
    ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)

    # Plot the "centerline" with `plot`
    ax.plot('x', 'mean', color='black', data=data_obj)

    plt.show()


def demo6():
    # 设置随机种子，以确保生成的随机数相同
    np.random.seed(1)

    # 创建一个从 0 到 4 的数组
    x = np.arange(5)

    # 生成 5 个从标准正态分布中采样的随机数
    y = np.random.randn(5)

    # 创建一个包含两个子图的图形，每列一个子图，图形的纵横比为 1:2
    fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1. / 2))

    # 在第一个子图中绘制垂直柱状图
    axes[0].bar(x, y, color='lightblue', align='center')

    # 在第二个子图中绘制水平柱状图
    axes[1].barh(x, y, color='lightblue', align='center')

    # 在第一个子图中添加水平基线
    axes[0].axhline(0, color='gray', linewidth=2)

    # 在第二个子图中添加垂直基线
    axes[1].axvline(0, color='gray', linewidth=2)

    # 显示图形
    plt.show()


if __name__ == "__main__":

    # 初步
    # demo1()

    # 轴数组绘制
    # demo2()

    # 描点绘制
    # demo3()

    # 不同形状的线绘制
    # demo4()

    # 关键字
    # demo5()

    # 条形图
    demo6()